package org.lw.proxy.myproxy;

import org.aopalliance.aop.Advice;

import java.lang.reflect.Proxy;
import java.util.Arrays;

public class MyLoggingProxyFactory {

    //生成代理对象
    public static Object createProxy(Object target) {
        {
            /*
            *   newProxyInstance方法的参数
            *     1、ClassLoader loader：类加载器，用于加载代理类。可以通过目标对象的类加载器获取
            *     2、Class<?>[] interfaces：目标对象实现的接口，代理对象和目标对象实现相同的接口
            *     3、InvocationHandler h：用于处理方法调用的处理器，即代理对象的方法调用会交给该处理器处理
            * */
            return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    /*
                    *    InvocationHandler接口的参数
                    *     1、Object proxy：代理对象，即代理对象的方法调用会交给该处理器处理
                    *     2、Method method：目标对象的方法对象
                    *     3、Object[] args：目标对象的方法参数
                    * */
                    (proxy, method, args) -> {
                        if (!method.getName().equals("equals")) {
                            System.out.println("方法：" + method.getName() + "开始执行，参数是：" + Arrays.toString(args));
                        }
                        Object result = method.invoke(target, args);
                        if (!method.getName().equals("equals")) {
                            System.out.println("方法：" + method.getName() + "正常结束");
                        }
                        return result;
                    }
            );
        }

    }
}

/*
*     简单了解东岱代理的原理
*       1、代理对象和目标对象实现相同的接口
*       2、代理对象的方法调用会交给InvocationHandler处理
*       3、InvocationHandler处理方法调用
*       4、InvocationHandler处理方法调用时，可以调用目标对象的方法
*       5、InvocationHandler处理方法调用时，可以添加额外的功能
*       6、InvocationHandler处理方法调用时，可以控制方法调用的执行
*
* */
